#pragma once

typedef int MSGID;

enum eMsgTypes { MSG_NULL = 0, MSG_CREATE_PLAYER, MSG_CREATE_ENEMY_LEVEL_ONE, 
MSG_CREATE_ENEMY_LEVEL_TWO, MSG_CREATE_ENEMY_LEVEL_THREE, MSG_CREATE_POWERUP,
MSG_DESTROY_POWERUP, MSG_CREATE_BULLET, MSG_DESTROY_PLAYER, MSG_DESTROY_ENEMY, 
MSG_DESTROY_BULLET, MSG_MAX };

class CBaseMessage
{
private:
	MSGID	m_msgID;

public:
	CBaseMessage(MSGID msgID)
	{
		m_msgID = msgID;
	}

	virtual ~CBaseMessage(void) {}

	MSGID GetMsgID(void)	{ return m_msgID; }
};

class CCreateEnemyLevelOneMessage : public CBaseMessage
{
public:
	CCreateEnemyLevelOneMessage();
};

class CCreateEnemyLevelTwoMessage : public CBaseMessage
{
public:
	CCreateEnemyLevelTwoMessage();
};

class CCreateEnemyLevelThreeMessage : public CBaseMessage
{
public:
	CCreateEnemyLevelThreeMessage();
};

class CBase;

class CCreateBulletMessage : public CBaseMessage
{
	CBase* m_pBase;
public:
	CCreateBulletMessage(CBase* pBase);
	~CCreateBulletMessage();

	CBase* GetBase() {return m_pBase;}
};

class CEnemy;

class CDestroyEnemyMessage : public CBaseMessage
{
	CEnemy* m_pEnemy;
public:
	CDestroyEnemyMessage(CEnemy* pEnemy);
	~CDestroyEnemyMessage();

	CEnemy* GetEnemy() {return m_pEnemy;}
};

class CCreatePowerUpMessage : public CBaseMessage
{
	CEnemy* m_pEnemy;
public:
	CCreatePowerUpMessage(CEnemy* pEnemy);
	~CCreatePowerUpMessage();

	CEnemy* GetEnemy() {return m_pEnemy;}
};

class CPowerUp;

class CDestroyPowerUpMessage : public CBaseMessage
{
	CPowerUp* m_pPowerUp;
public:
	CDestroyPowerUpMessage(CPowerUp* pPowerUp);
	~CDestroyPowerUpMessage();

	CPowerUp* GetPowerUp() { return m_pPowerUp;}
};

class CBullet;

class CDestroyBulletMessage : public CBaseMessage
{
	CBullet* m_pBullet;
public:
	CDestroyBulletMessage(CBullet* pBullet);
	~CDestroyBulletMessage();

	CBullet* GetBullet() {return m_pBullet;}
};

class CShip;

class CCreatePlayerMessage : public CBaseMessage
{
public:
	CCreatePlayerMessage();

};

class CDestroyPlayerMessage : public CBaseMessage
{
	CShip* m_pShip;
public:
	CDestroyPlayerMessage(CShip* pShip);
	~CDestroyPlayerMessage();

	CShip* GetShip() {return m_pShip;}
};